{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From D:\\anaconda3\\lib\\site-packages\\tensorflow\\python\\compat\\v2_compat.py:96: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "non-resource variables are not supported in the long term\n"
     ]
    }
   ],
   "source": [
    "import tensorflow.compat.v1 as tf\n",
    "tf.disable_v2_behavior()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import math\n",
    "import time\n",
    "import random\n",
    "import numpy as np\n",
    "from collections import deque\n",
    "from queue import deque\n",
    "from ChessBoard import ChessBoard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 定义超参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "EMPTY = 2\n",
    "# 超参数\n",
    "GAMMA = 0.9         # Q衰减系数\n",
    "INITIAL_E = 0.1     # 初始ε\n",
    "FINAL_E = 0.001\t\t# 初始ε\n",
    "REPLAY_SIZE = 15000  # 经验回放大小\n",
    "BATCH_SIZE = 200  \t# 批大小\n",
    "TAGET_Q_STEP = 100  # 目标网络同步训练次数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 定义DQN类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQN():\n",
    "    def __init__(self):\n",
    "        # 棋盘大小\n",
    "        self.SIZE = ChessBoard.SIZE\n",
    "        self.state_dim = self.SIZE * self.SIZE\n",
    "        self.action_dim = self.SIZE * self.SIZE\n",
    "        # 其它参数\n",
    "        self.replay_buffer = deque()\n",
    "        self.time_step = 0\n",
    "        self.epsilon = INITIAL_E\n",
    "\n",
    "        # 创建网络\n",
    "        self.create_Q()\n",
    "        self.create_targetQ()\n",
    "        self.targetQ_step = TAGET_Q_STEP\n",
    "        # 定义优化器\n",
    "        self.train_method()\n",
    "        # 定义执行器\n",
    "        gpu_options = tf.GPUOptions(allow_growth=True)\n",
    "        gpu_options = tf.GPUOptions(\n",
    "            per_process_gpu_memory_fraction=0.8, allow_growth=True)  # 每个gpu占用0.8的显存\n",
    "        config = tf.ConfigProto(\n",
    "            gpu_options=gpu_options, allow_soft_placement=True, log_device_placement=False)\n",
    "        # 如果电脑有多个GPU，tensorflow默认全部使用。如果想只使用部分GPU，可以设置CUDA_VISIBLE_DEVICES。\n",
    "        self.sess = tf.Session(config=config)\n",
    "\n",
    "        # 网络初始化\n",
    "        self.init = tf.global_variables_initializer()\n",
    "        self.sess.run(self.init)\n",
    "\n",
    "    def create_Q(self):\n",
    "        # 网络权值\n",
    "        W1 = self.weight_variable([5, 5, 1, 16])\n",
    "        b1 = self.bias_variable([16])  # 5*5*16\n",
    "        W2 = self.weight_variable([5*5*16+1, 225])\n",
    "        b2 = self.bias_variable([1, 225])\n",
    "\n",
    "        # 输入层\n",
    "        self.state_input = tf.placeholder(\"float\", [None, self.state_dim])\n",
    "        self.turn = tf.placeholder(\"float\", [None, 1])\n",
    "\n",
    "        y0 = tf.reshape(self.state_input, [-1, 15, 15, 1])\n",
    "        # 第一卷积层\n",
    "        h1 = tf.nn.relu(self.conv2d(y0, W1) + b1)\n",
    "        y1 = self.max_pool_3_3(h1)  # 5*5*16\n",
    "\n",
    "        # 第二全连接层tf.concat([t1, t2], 0)\n",
    "        h2 = tf.concat([tf.reshape(y1, [-1, 5 * 5 * 16]), self.turn], 1)\n",
    "        self.Q_value = tf.matmul(h2, W2)+b2\n",
    "        # 保存权重\n",
    "        self.Q_weihgts = [W1, b1, W2, b2]\n",
    "\n",
    "    def create_targetQ(self):\n",
    "        # 网络权值\n",
    "        W1 = self.weight_variable([5, 5, 1, 16])\n",
    "        b1 = self.bias_variable([16])  # 5*5*16\n",
    "        W2 = self.weight_variable([5*5*16+1, 225])\n",
    "        b2 = self.bias_variable([1, 225])\n",
    "\n",
    "        # 输入层\n",
    "        # self.state_input = tf.placeholder(\"float\", [None, self.state_dim])\n",
    "        # self.turn = tf.placeholder(\"float\", [None, 1])\n",
    "\n",
    "        y0 = tf.reshape(self.state_input, [-1, 15, 15, 1])\n",
    "        # 第一卷积层\n",
    "        h1 = tf.nn.relu(self.conv2d(y0, W1) + b1)\n",
    "        y1 = self.max_pool_3_3(h1)  # 5*5*16\n",
    "\n",
    "        # 第二全连接层tf.concat([t1, t2], 0)\n",
    "        h2 = tf.concat([tf.reshape(y1, [-1, 5 * 5 * 16]), self.turn], 1)\n",
    "        self.targetQ_value = tf.matmul(h2, W2)+b2\n",
    "        # 保存权重\n",
    "        self.targetQ_weights = [W1, b1, W2, b2]\n",
    "\n",
    "    def copy(self):\n",
    "        \"\"\"拷贝网络\"\"\"\n",
    "        for i in range(len(self.Q_weihgts)):\n",
    "            self.sess.run(\n",
    "                tf.assign(self.targetQ_weights[i], self.Q_weihgts[i]))\n",
    "\n",
    "    def train_method(self):\n",
    "        self.action_input = tf.placeholder(\"float\", [None, self.action_dim])\n",
    "        self.y_input = tf.placeholder(\"float\", [None])\n",
    "\n",
    "        Q_action = tf.reduce_sum(tf.multiply(\n",
    "            self.Q_value, self.action_input), reduction_indices=1)  # mul->matmul\n",
    "        self.cost = tf.reduce_mean(tf.square(self.y_input - Q_action))\n",
    "        self.train = tf.train.AdamOptimizer(1e-3).minimize(self.cost)\n",
    "\n",
    "    def perceive(self, state, action, reward, next_state, done):\n",
    "        \"\"\"添加经验池\"\"\"\n",
    "        one_hot_action = np.zeros(self.action_dim)\n",
    "        one_hot_action[action] = 1\n",
    "        self.replay_buffer.append(\n",
    "            [state, one_hot_action, reward, next_state, done])\n",
    "        # 经验池满了\n",
    "        if len(self.replay_buffer) > REPLAY_SIZE:\n",
    "            self.replay_buffer.popleft()\n",
    "        # 一个batch够了\n",
    "        if len(self.replay_buffer) > BATCH_SIZE:\n",
    "            self.train_Q_network()\n",
    "\n",
    "    def modify_last_reward(self, new_reward):\n",
    "        v = self.replay_buffer.pop()\n",
    "        v[2] = new_reward\n",
    "        self.replay_buffer.append(v)\n",
    "\n",
    "    def train_Q_network(self):\n",
    "        self.time_step += 1\n",
    "        # 构建一个小的训练batch\n",
    "        minibatch = random.sample(self.replay_buffer, BATCH_SIZE)\n",
    "        state_batch = [data[0][0] for data in minibatch]\n",
    "        state_batch_turn = [data[0][1] for data in minibatch]\n",
    "        action_batch = [data[1] for data in minibatch]\n",
    "        reward_batch = [data[2] for data in minibatch]\n",
    "        next_state_batch = [data[3][0] for data in minibatch]\n",
    "        next_state_batch_turn = [data[3][1] for data in minibatch]\n",
    "        # 构建训练数据\n",
    "        y_batch = []\n",
    "\n",
    "        \"\"\"\n",
    "            这里是计算新局面的估值                                                                                                                    Q'\n",
    "            使用：targetQ 或 Q  网络来计算\n",
    "\n",
    "            全局就在此处可能使用targetQ，作为对新状态的估值\n",
    "        \"\"\"\n",
    "        # 计算Q'的所有值\n",
    "\n",
    "        # Q_value_batch = self.sess.run(self.Q_value, feed_dict={\n",
    "        #    self.state_input: next_state_batch, self.turn: next_state_batch_turn})\n",
    "        Q_value_batch = self.sess.run(self.targetQ_value, feed_dict={\n",
    "            self.state_input: next_state_batch, self.turn: next_state_batch_turn})\n",
    "\n",
    "        # Q的值 Q = γ * max(Q')\n",
    "        for i in range(0, BATCH_SIZE):\n",
    "            done = minibatch[i][4]  # 是否结束\n",
    "            if done:\n",
    "                y_batch.append(reward_batch[i])\n",
    "            else:\n",
    "                y_batch.append(reward_batch[i] +\n",
    "                               GAMMA * np.max(Q_value_batch[i]))\n",
    "        self.sess.run(self.train, feed_dict={\n",
    "                      self.y_input: y_batch, self.action_input: action_batch, self.state_input: state_batch, self.turn: state_batch_turn})\n",
    "\n",
    "        # 每一定轮次 拷贝Q网络到targetQ网络\n",
    "        if self.time_step % self.targetQ_step == 0:\n",
    "            self.copy()\n",
    "\n",
    "    def egreedy_action(self, state):\n",
    "        \"\"\"含有随机 计算一步\"\"\"\n",
    "        # 计算当前局面的所有Q值\n",
    "        Q_value = self.sess.run(self.Q_value, feed_dict={\n",
    "                                self.state_input: [state[0]], self.turn: [state[1]]})[0]\n",
    "\n",
    "        min_v = Q_value[np.argmin(Q_value)] - 1  # 最小的Q_value -1\n",
    "        valid_action = []\n",
    "\n",
    "        for i in range(len(Q_value)):  # 遍历每一个落子点\n",
    "            if state[0][i] == EMPTY:  # 空，可以落子\n",
    "                valid_action.append(i)\n",
    "            else:  # 有棋子，不可以落子\n",
    "                Q_value[i] = min_v\n",
    "\n",
    "        # 以 epsilon的概率随机落子\n",
    "        if random.random() <= self.epsilon:\n",
    "            l = len(valid_action)\n",
    "            if l == 0:\n",
    "                return -1\n",
    "            else:\n",
    "                return valid_action[random.randint(0, len(valid_action) - 1)]\n",
    "        else:  # 其它清空，选取Q最大的点落子\n",
    "            return np.argmax(Q_value)\n",
    "\n",
    "    def action(self, state):\n",
    "       # 计算当前局面的所有Q值\n",
    "        Q_value = self.sess.run(self.Q_value, feed_dict={\n",
    "            self.state_input: [state[0]], self.turn: [state[1]]})[0]\n",
    "\n",
    "        min_v = Q_value[np.argmin(Q_value)] - 1  # 最小的Q_value -1\n",
    "        valid_action = []\n",
    "\n",
    "        for i in range(len(Q_value)):  # 遍历每一个落子点\n",
    "            if state[0][i] == EMPTY:  # 空，可以落子\n",
    "                valid_action.append(i)\n",
    "            else:  # 有棋子，不可以落子\n",
    "                Q_value[i] = min_v\n",
    "        return np.argmax(Q_value)\n",
    "\n",
    "    def weight_variable(self, shape):\n",
    "        initial = tf.truncated_normal(shape)\n",
    "        return tf.Variable(initial)\n",
    "\n",
    "    def bias_variable(self, shape):\n",
    "        initial = tf.constant(0.01, shape=shape)\n",
    "        return tf.Variable(initial)\n",
    "\n",
    "    def conv2d(self, x, w):\n",
    "        \"\"\"定义卷积函数\"\"\"\n",
    "        return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')\n",
    "\n",
    "    def max_pool_3_3(self, x):\n",
    "        \"\"\"定义2*2最大池化层\"\"\"\n",
    "        return tf.nn.max_pool(x, ksize=[1, 3, 3, 1], strides=[1, 3, 3, 1], padding='SAME')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test():\n",
    "    total_reward = 0\n",
    "    # 初始一个棋盘\n",
    "    chess = ChessBoard()  # 创建一个主棋盘\n",
    "    chess.reset()\n",
    "    \n",
    "    state = chess.board\n",
    "    camp = np.zeros([1])\n",
    "    camp[0] = -1\n",
    "    state = np.reshape(state, [-1])\n",
    "    state = [state, camp]\n",
    "    \n",
    "    for j in range(225):\n",
    "        # 开始走棋\n",
    "        action = agent.action(state)  # 按照Q网络的走一步\n",
    "        action = [math.floor(action/ChessBoard.SIZE), action %\n",
    "                  ChessBoard.SIZE, camp]  # 转化为二维棋盘坐标\n",
    "\n",
    "        state, reward, done, _ = chess.draw_XY(action[0], action[1])\n",
    "        state = np.reshape(state, [-1])\n",
    "        \n",
    "        if j % 2 == 0:\n",
    "            camp[0] = 1\n",
    "        else:\n",
    "            camp[0] = -1\n",
    "        state = [state, camp]\n",
    "        total_reward += reward\n",
    "\n",
    "        # 打印棋盘\n",
    "        os.system(\"cls\")\n",
    "        chess.printChess()\n",
    "        if camp == 1:\n",
    "            print(\" BLACK %d   %d\\n\" % (action[0], action[1]))\n",
    "        else:\n",
    "            print(\" WHITE %d   %d\\n\" % (action[0], action[1]))\n",
    "        time.sleep(2)  # 睡眠延时\n",
    "\n",
    "        # 结束判断\n",
    "        if done:\n",
    "            print(\"done step:%d  episode:%d\" % (j, episode))\n",
    "            # print('done')\n",
    "            time.sleep(5)\n",
    "            break\n",
    "    ave_reward = total_reward\n",
    "    print('episode: ', episode, 'Evaluation Average Reward:', ave_reward)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_step = []\n",
    "agent = DQN()  # 创建网络对象\n",
    "agent.copy()  # 拷贝Q网络参数到targetQ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def main():\n",
    "    # 一些超参数\n",
    "    EPISODE = 10000\n",
    "    STEP = 300\n",
    "    TEST = 1\n",
    "\n",
    "    chess = ChessBoard()  # 创建一个主棋盘\n",
    "\n",
    "    for episode in range(EPISODE):\n",
    "        # 初始一个棋盘\n",
    "        chess.reset()\n",
    "        state = chess.board\n",
    "        camp = np.zeros([1])\n",
    "        camp[0] = -1\n",
    "        state = np.reshape(state, [-1])  # 二维数组转换为一维数组\n",
    "        state = [state, camp]\n",
    "        \n",
    "        if episode%100==99 and agent.epsilon>FINAL_E:\n",
    "            agent.epsilon *= 0.99  # 每100局，减小随机选择落子点的概率\n",
    "            \n",
    "        # 训练\n",
    "        for step in range(STEP):\n",
    "            # 自己下一步棋\n",
    "            action_1d = agent.egreedy_action(state)  # 有随机概率的走一步\n",
    "            action_2d = [math.floor(action_1d / ChessBoard.SIZE), action_1d %\n",
    "                         ChessBoard.SIZE, camp]  # 转化为二维棋盘坐标\n",
    "            # 在模拟棋盘上落子\n",
    "            next_state_2d, reward, done, _ = chess.draw_XY(\n",
    "                action_2d[0], action_2d[1])\n",
    "            next_state = np.reshape(next_state_2d, [-1])\n",
    "            # 构造数据\n",
    "            if step % 2 == 0:\n",
    "                camp[0] = 1\n",
    "            else:\n",
    "                camp[0] = -1\n",
    "            next_state = [next_state, camp]\n",
    "            # 定义奖励\n",
    "            reward_agent = reward\n",
    "            # 丢入经验池  执行训练\n",
    "            agent.perceive(state, action_1d, reward, next_state, done)\n",
    "            state = next_state\n",
    "            # 判断这一步走了每    没走说明这一步是非法的，发生了碰撞，立即结束当前棋局，重开一局\n",
    "            # 上面的判断不是很对\n",
    "            # 成功落子后反而跳出了\n",
    "            if done:\n",
    "                #chess.printChess()\n",
    "                train_step.append(step)\n",
    "                print(\"done step:%d  episode:%d epsilon:%.5f\" % (step, episode,agent.epsilon))\n",
    "                break  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "done step:49  episode:0 epsilon:0.06173\n",
      "done step:65  episode:1 epsilon:0.06173\n",
      "done step:29  episode:2 epsilon:0.06173\n",
      "done step:39  episode:3 epsilon:0.06173\n",
      "done step:25  episode:4 epsilon:0.06173\n",
      "done step:38  episode:5 epsilon:0.06173\n",
      "done step:37  episode:6 epsilon:0.06173\n",
      "done step:28  episode:7 epsilon:0.06173\n",
      "done step:40  episode:8 epsilon:0.06173\n",
      "done step:57  episode:9 epsilon:0.06173\n",
      "done step:44  episode:10 epsilon:0.06173\n",
      "done step:38  episode:11 epsilon:0.06173\n",
      "done step:37  episode:12 epsilon:0.06173\n",
      "done step:127  episode:13 epsilon:0.06173\n",
      "done step:107  episode:14 epsilon:0.06173\n",
      "done step:21  episode:15 epsilon:0.06173\n",
      "done step:25  episode:16 epsilon:0.06173\n",
      "done step:115  episode:17 epsilon:0.06173\n",
      "done step:21  episode:18 epsilon:0.06173\n",
      "done step:35  episode:19 epsilon:0.06173\n",
      "done step:29  episode:20 epsilon:0.06173\n",
      "done step:106  episode:21 epsilon:0.06173\n",
      "done step:21  episode:22 epsilon:0.06173\n",
      "done step:33  episode:23 epsilon:0.06173\n",
      "done step:34  episode:24 epsilon:0.06173\n",
      "done step:18  episode:25 epsilon:0.06173\n",
      "done step:30  episode:26 epsilon:0.06173\n",
      "done step:114  episode:27 epsilon:0.06173\n",
      "done step:79  episode:28 epsilon:0.06173\n",
      "done step:21  episode:29 epsilon:0.06173\n",
      "done step:23  episode:30 epsilon:0.06173\n",
      "done step:54  episode:31 epsilon:0.06173\n",
      "done step:28  episode:32 epsilon:0.06173\n",
      "done step:49  episode:33 epsilon:0.06173\n",
      "done step:25  episode:34 epsilon:0.06173\n",
      "done step:25  episode:35 epsilon:0.06173\n",
      "done step:77  episode:36 epsilon:0.06173\n",
      "done step:90  episode:37 epsilon:0.06173\n",
      "done step:23  episode:38 epsilon:0.06173\n",
      "done step:25  episode:39 epsilon:0.06173\n",
      "done step:34  episode:40 epsilon:0.06173\n",
      "done step:17  episode:41 epsilon:0.06173\n",
      "done step:15  episode:42 epsilon:0.06173\n",
      "done step:17  episode:43 epsilon:0.06173\n",
      "done step:101  episode:44 epsilon:0.06173\n",
      "done step:29  episode:45 epsilon:0.06173\n",
      "done step:19  episode:46 epsilon:0.06173\n",
      "done step:17  episode:47 epsilon:0.06173\n",
      "done step:19  episode:48 epsilon:0.06173\n",
      "done step:27  episode:49 epsilon:0.06173\n",
      "done step:21  episode:50 epsilon:0.06173\n",
      "done step:19  episode:51 epsilon:0.06173\n",
      "done step:13  episode:52 epsilon:0.06173\n",
      "done step:40  episode:53 epsilon:0.06173\n",
      "done step:56  episode:54 epsilon:0.06173\n",
      "done step:38  episode:55 epsilon:0.06173\n",
      "done step:44  episode:56 epsilon:0.06173\n",
      "done step:13  episode:57 epsilon:0.06173\n",
      "done step:42  episode:58 epsilon:0.06173\n",
      "done step:69  episode:59 epsilon:0.06173\n",
      "done step:138  episode:60 epsilon:0.06173\n",
      "done step:43  episode:61 epsilon:0.06173\n",
      "done step:143  episode:62 epsilon:0.06173\n",
      "done step:53  episode:63 epsilon:0.06173\n",
      "done step:45  episode:64 epsilon:0.06173\n",
      "done step:67  episode:65 epsilon:0.06173\n",
      "done step:9  episode:66 epsilon:0.06173\n",
      "done step:146  episode:67 epsilon:0.06173\n",
      "done step:51  episode:68 epsilon:0.06173\n",
      "done step:130  episode:69 epsilon:0.06173\n",
      "done step:21  episode:70 epsilon:0.06173\n",
      "done step:27  episode:71 epsilon:0.06173\n",
      "done step:63  episode:72 epsilon:0.06173\n",
      "done step:52  episode:73 epsilon:0.06173\n",
      "done step:53  episode:74 epsilon:0.06173\n",
      "done step:85  episode:75 epsilon:0.06173\n",
      "done step:130  episode:76 epsilon:0.06173\n",
      "done step:40  episode:77 epsilon:0.06173\n",
      "done step:50  episode:78 epsilon:0.06173\n",
      "done step:106  episode:79 epsilon:0.06173\n",
      "done step:67  episode:80 epsilon:0.06173\n",
      "done step:25  episode:81 epsilon:0.06173\n",
      "done step:40  episode:82 epsilon:0.06173\n",
      "done step:26  episode:83 epsilon:0.06173\n",
      "done step:50  episode:84 epsilon:0.06173\n",
      "done step:56  episode:85 epsilon:0.06173\n",
      "done step:42  episode:86 epsilon:0.06173\n",
      "done step:11  episode:87 epsilon:0.06173\n",
      "done step:11  episode:88 epsilon:0.06173\n",
      "done step:78  episode:89 epsilon:0.06173\n",
      "done step:34  episode:90 epsilon:0.06173\n",
      "done step:52  episode:91 epsilon:0.06173\n",
      "done step:39  episode:92 epsilon:0.06173\n",
      "done step:32  episode:93 epsilon:0.06173\n",
      "done step:40  episode:94 epsilon:0.06173\n",
      "done step:36  episode:95 epsilon:0.06173\n",
      "done step:48  episode:96 epsilon:0.06173\n",
      "done step:30  episode:97 epsilon:0.06173\n",
      "done step:72  episode:98 epsilon:0.06173\n",
      "done step:134  episode:99 epsilon:0.06111\n",
      "done step:15  episode:100 epsilon:0.06111\n",
      "done step:19  episode:101 epsilon:0.06111\n",
      "done step:33  episode:102 epsilon:0.06111\n",
      "done step:21  episode:103 epsilon:0.06111\n",
      "done step:42  episode:104 epsilon:0.06111\n",
      "done step:31  episode:105 epsilon:0.06111\n",
      "done step:15  episode:106 epsilon:0.06111\n",
      "done step:9  episode:107 epsilon:0.06111\n",
      "done step:9  episode:108 epsilon:0.06111\n",
      "done step:44  episode:109 epsilon:0.06111\n",
      "done step:13  episode:110 epsilon:0.06111\n",
      "done step:38  episode:111 epsilon:0.06111\n",
      "done step:24  episode:112 epsilon:0.06111\n",
      "done step:15  episode:113 epsilon:0.06111\n",
      "done step:13  episode:114 epsilon:0.06111\n",
      "done step:15  episode:115 epsilon:0.06111\n",
      "done step:17  episode:116 epsilon:0.06111\n",
      "done step:13  episode:117 epsilon:0.06111\n",
      "done step:19  episode:118 epsilon:0.06111\n",
      "done step:28  episode:119 epsilon:0.06111\n",
      "done step:27  episode:120 epsilon:0.06111\n",
      "done step:9  episode:121 epsilon:0.06111\n",
      "done step:9  episode:122 epsilon:0.06111\n",
      "done step:42  episode:123 epsilon:0.06111\n",
      "done step:26  episode:124 epsilon:0.06111\n",
      "done step:20  episode:125 epsilon:0.06111\n",
      "done step:34  episode:126 epsilon:0.06111\n",
      "done step:28  episode:127 epsilon:0.06111\n",
      "done step:32  episode:128 epsilon:0.06111\n",
      "done step:18  episode:129 epsilon:0.06111\n",
      "done step:26  episode:130 epsilon:0.06111\n",
      "done step:30  episode:131 epsilon:0.06111\n",
      "done step:30  episode:132 epsilon:0.06111\n",
      "done step:30  episode:133 epsilon:0.06111\n",
      "done step:80  episode:134 epsilon:0.06111\n",
      "done step:22  episode:135 epsilon:0.06111\n",
      "done step:13  episode:136 epsilon:0.06111\n",
      "done step:13  episode:137 epsilon:0.06111\n",
      "done step:15  episode:138 epsilon:0.06111\n",
      "done step:50  episode:139 epsilon:0.06111\n",
      "done step:15  episode:140 epsilon:0.06111\n",
      "done step:20  episode:141 epsilon:0.06111\n",
      "done step:20  episode:142 epsilon:0.06111\n",
      "done step:9  episode:143 epsilon:0.06111\n",
      "done step:22  episode:144 epsilon:0.06111\n",
      "done step:18  episode:145 epsilon:0.06111\n",
      "done step:12  episode:146 epsilon:0.06111\n",
      "done step:15  episode:147 epsilon:0.06111\n",
      "done step:14  episode:148 epsilon:0.06111\n",
      "done step:14  episode:149 epsilon:0.06111\n",
      "done step:30  episode:150 epsilon:0.06111\n",
      "done step:18  episode:151 epsilon:0.06111\n",
      "done step:10  episode:152 epsilon:0.06111\n",
      "done step:12  episode:153 epsilon:0.06111\n",
      "done step:12  episode:154 epsilon:0.06111\n",
      "done step:16  episode:155 epsilon:0.06111\n",
      "done step:12  episode:156 epsilon:0.06111\n",
      "done step:12  episode:157 epsilon:0.06111\n",
      "done step:16  episode:158 epsilon:0.06111\n",
      "done step:18  episode:159 epsilon:0.06111\n",
      "done step:16  episode:160 epsilon:0.06111\n",
      "done step:22  episode:161 epsilon:0.06111\n",
      "done step:13  episode:162 epsilon:0.06111\n",
      "done step:12  episode:163 epsilon:0.06111\n",
      "done step:13  episode:164 epsilon:0.06111\n",
      "done step:13  episode:165 epsilon:0.06111\n",
      "done step:14  episode:166 epsilon:0.06111\n",
      "done step:28  episode:167 epsilon:0.06111\n",
      "done step:11  episode:168 epsilon:0.06111\n",
      "done step:14  episode:169 epsilon:0.06111\n",
      "done step:9  episode:170 epsilon:0.06111\n",
      "done step:11  episode:171 epsilon:0.06111\n",
      "done step:50  episode:172 epsilon:0.06111\n",
      "done step:40  episode:173 epsilon:0.06111\n",
      "done step:14  episode:174 epsilon:0.06111\n",
      "done step:12  episode:175 epsilon:0.06111\n",
      "done step:12  episode:176 epsilon:0.06111\n",
      "done step:8  episode:177 epsilon:0.06111\n",
      "done step:10  episode:178 epsilon:0.06111\n",
      "done step:36  episode:179 epsilon:0.06111\n",
      "done step:12  episode:180 epsilon:0.06111\n",
      "done step:10  episode:181 epsilon:0.06111\n",
      "done step:12  episode:182 epsilon:0.06111\n",
      "done step:14  episode:183 epsilon:0.06111\n",
      "done step:36  episode:184 epsilon:0.06111\n",
      "done step:10  episode:185 epsilon:0.06111\n",
      "done step:10  episode:186 epsilon:0.06111\n",
      "done step:15  episode:187 epsilon:0.06111\n",
      "done step:10  episode:188 epsilon:0.06111\n",
      "done step:9  episode:189 epsilon:0.06111\n",
      "done step:11  episode:190 epsilon:0.06111\n",
      "done step:13  episode:191 epsilon:0.06111\n",
      "done step:10  episode:192 epsilon:0.06111\n",
      "done step:8  episode:193 epsilon:0.06111\n",
      "done step:8  episode:194 epsilon:0.06111\n",
      "done step:10  episode:195 epsilon:0.06111\n",
      "done step:106  episode:196 epsilon:0.06111\n",
      "done step:8  episode:197 epsilon:0.06111\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "done step:11  episode:198 epsilon:0.06111\n",
      "done step:13  episode:199 epsilon:0.06050\n",
      "done step:10  episode:200 epsilon:0.06050\n",
      "done step:8  episode:201 epsilon:0.06050\n",
      "done step:15  episode:202 epsilon:0.06050\n",
      "done step:12  episode:203 epsilon:0.06050\n",
      "done step:15  episode:204 epsilon:0.06050\n",
      "done step:8  episode:205 epsilon:0.06050\n",
      "done step:10  episode:206 epsilon:0.06050\n",
      "done step:10  episode:207 epsilon:0.06050\n",
      "done step:11  episode:208 epsilon:0.06050\n",
      "done step:9  episode:209 epsilon:0.06050\n",
      "done step:13  episode:210 epsilon:0.06050\n",
      "done step:10  episode:211 epsilon:0.06050\n",
      "done step:11  episode:212 epsilon:0.06050\n",
      "done step:10  episode:213 epsilon:0.06050\n",
      "done step:10  episode:214 epsilon:0.06050\n",
      "done step:15  episode:215 epsilon:0.06050\n",
      "done step:8  episode:216 epsilon:0.06050\n",
      "done step:11  episode:217 epsilon:0.06050\n",
      "done step:22  episode:218 epsilon:0.06050\n",
      "done step:10  episode:219 epsilon:0.06050\n",
      "done step:8  episode:220 epsilon:0.06050\n",
      "done step:8  episode:221 epsilon:0.06050\n",
      "done step:10  episode:222 epsilon:0.06050\n",
      "done step:8  episode:223 epsilon:0.06050\n",
      "done step:10  episode:224 epsilon:0.06050\n",
      "done step:10  episode:225 epsilon:0.06050\n",
      "done step:9  episode:226 epsilon:0.06050\n",
      "done step:8  episode:227 epsilon:0.06050\n",
      "done step:9  episode:228 epsilon:0.06050\n",
      "done step:10  episode:229 epsilon:0.06050\n",
      "done step:8  episode:230 epsilon:0.06050\n",
      "done step:42  episode:231 epsilon:0.06050\n",
      "done step:15  episode:232 epsilon:0.06050\n",
      "done step:44  episode:233 epsilon:0.06050\n",
      "done step:59  episode:234 epsilon:0.06050\n",
      "done step:10  episode:235 epsilon:0.06050\n",
      "done step:8  episode:236 epsilon:0.06050\n",
      "done step:13  episode:237 epsilon:0.06050\n",
      "done step:18  episode:238 epsilon:0.06050\n",
      "done step:22  episode:239 epsilon:0.06050\n",
      "done step:20  episode:240 epsilon:0.06050\n",
      "done step:49  episode:241 epsilon:0.06050\n",
      "done step:30  episode:242 epsilon:0.06050\n",
      "done step:85  episode:243 epsilon:0.06050\n",
      "done step:32  episode:244 epsilon:0.06050\n",
      "done step:14  episode:245 epsilon:0.06050\n",
      "done step:9  episode:246 epsilon:0.06050\n",
      "done step:10  episode:247 epsilon:0.06050\n",
      "done step:8  episode:248 epsilon:0.06050\n",
      "done step:40  episode:249 epsilon:0.06050\n",
      "done step:8  episode:250 epsilon:0.06050\n",
      "done step:20  episode:251 epsilon:0.06050\n",
      "done step:9  episode:252 epsilon:0.06050\n",
      "done step:36  episode:253 epsilon:0.06050\n",
      "done step:8  episode:254 epsilon:0.06050\n",
      "done step:34  episode:255 epsilon:0.06050\n",
      "done step:65  episode:256 epsilon:0.06050\n",
      "done step:8  episode:257 epsilon:0.06050\n",
      "done step:8  episode:258 epsilon:0.06050\n",
      "done step:8  episode:259 epsilon:0.06050\n",
      "done step:8  episode:260 epsilon:0.06050\n",
      "done step:24  episode:261 epsilon:0.06050\n",
      "done step:17  episode:262 epsilon:0.06050\n",
      "done step:8  episode:263 epsilon:0.06050\n",
      "done step:10  episode:264 epsilon:0.06050\n",
      "done step:13  episode:265 epsilon:0.06050\n",
      "done step:12  episode:266 epsilon:0.06050\n",
      "done step:13  episode:267 epsilon:0.06050\n",
      "done step:8  episode:268 epsilon:0.06050\n",
      "done step:14  episode:269 epsilon:0.06050\n",
      "done step:13  episode:270 epsilon:0.06050\n",
      "done step:14  episode:271 epsilon:0.06050\n",
      "done step:8  episode:272 epsilon:0.06050\n",
      "done step:8  episode:273 epsilon:0.06050\n",
      "done step:8  episode:274 epsilon:0.06050\n",
      "done step:15  episode:275 epsilon:0.06050\n",
      "done step:10  episode:276 epsilon:0.06050\n",
      "done step:12  episode:277 epsilon:0.06050\n",
      "done step:10  episode:278 epsilon:0.06050\n",
      "done step:15  episode:279 epsilon:0.06050\n",
      "done step:44  episode:280 epsilon:0.06050\n",
      "done step:8  episode:281 epsilon:0.06050\n",
      "done step:19  episode:282 epsilon:0.06050\n",
      "done step:15  episode:283 epsilon:0.06050\n",
      "done step:10  episode:284 epsilon:0.06050\n",
      "done step:10  episode:285 epsilon:0.06050\n",
      "done step:13  episode:286 epsilon:0.06050\n",
      "done step:13  episode:287 epsilon:0.06050\n",
      "done step:12  episode:288 epsilon:0.06050\n",
      "done step:56  episode:289 epsilon:0.06050\n",
      "done step:19  episode:290 epsilon:0.06050\n",
      "done step:23  episode:291 epsilon:0.06050\n",
      "done step:26  episode:292 epsilon:0.06050\n",
      "done step:10  episode:293 epsilon:0.06050\n",
      "done step:13  episode:294 epsilon:0.06050\n",
      "done step:10  episode:295 epsilon:0.06050\n",
      "done step:10  episode:296 epsilon:0.06050\n",
      "done step:23  episode:297 epsilon:0.06050\n",
      "done step:10  episode:298 epsilon:0.06050\n",
      "done step:49  episode:299 epsilon:0.05990\n",
      "done step:15  episode:300 epsilon:0.05990\n",
      "done step:12  episode:301 epsilon:0.05990\n",
      "done step:10  episode:302 epsilon:0.05990\n",
      "done step:8  episode:303 epsilon:0.05990\n",
      "done step:10  episode:304 epsilon:0.05990\n",
      "done step:10  episode:305 epsilon:0.05990\n",
      "done step:19  episode:306 epsilon:0.05990\n",
      "done step:52  episode:307 epsilon:0.05990\n",
      "done step:15  episode:308 epsilon:0.05990\n",
      "done step:17  episode:309 epsilon:0.05990\n",
      "done step:26  episode:310 epsilon:0.05990\n",
      "done step:52  episode:311 epsilon:0.05990\n",
      "done step:105  episode:312 epsilon:0.05990\n",
      "done step:119  episode:313 epsilon:0.05990\n",
      "done step:16  episode:314 epsilon:0.05990\n",
      "done step:8  episode:315 epsilon:0.05990\n",
      "done step:10  episode:316 epsilon:0.05990\n",
      "done step:10  episode:317 epsilon:0.05990\n",
      "done step:17  episode:318 epsilon:0.05990\n",
      "done step:52  episode:319 epsilon:0.05990\n",
      "done step:15  episode:320 epsilon:0.05990\n",
      "done step:13  episode:321 epsilon:0.05990\n",
      "done step:49  episode:322 epsilon:0.05990\n",
      "done step:10  episode:323 epsilon:0.05990\n",
      "done step:17  episode:324 epsilon:0.05990\n",
      "done step:17  episode:325 epsilon:0.05990\n",
      "done step:23  episode:326 epsilon:0.05990\n",
      "done step:19  episode:327 epsilon:0.05990\n",
      "done step:8  episode:328 epsilon:0.05990\n",
      "done step:28  episode:329 epsilon:0.05990\n",
      "done step:21  episode:330 epsilon:0.05990\n",
      "done step:15  episode:331 epsilon:0.05990\n",
      "done step:17  episode:332 epsilon:0.05990\n",
      "done step:17  episode:333 epsilon:0.05990\n",
      "done step:14  episode:334 epsilon:0.05990\n",
      "done step:19  episode:335 epsilon:0.05990\n",
      "done step:10  episode:336 epsilon:0.05990\n",
      "done step:15  episode:337 epsilon:0.05990\n",
      "done step:15  episode:338 epsilon:0.05990\n",
      "done step:85  episode:339 epsilon:0.05990\n",
      "done step:14  episode:340 epsilon:0.05990\n",
      "done step:12  episode:341 epsilon:0.05990\n",
      "done step:49  episode:342 epsilon:0.05990\n",
      "done step:12  episode:343 epsilon:0.05990\n",
      "done step:17  episode:344 epsilon:0.05990\n",
      "done step:15  episode:345 epsilon:0.05990\n",
      "done step:59  episode:346 epsilon:0.05990\n",
      "done step:17  episode:347 epsilon:0.05990\n",
      "done step:14  episode:348 epsilon:0.05990\n",
      "done step:23  episode:349 epsilon:0.05990\n",
      "done step:12  episode:350 epsilon:0.05990\n",
      "done step:34  episode:351 epsilon:0.05990\n",
      "done step:13  episode:352 epsilon:0.05990\n",
      "done step:8  episode:353 epsilon:0.05990\n",
      "done step:13  episode:354 epsilon:0.05990\n",
      "done step:13  episode:355 epsilon:0.05990\n",
      "done step:13  episode:356 epsilon:0.05990\n",
      "done step:13  episode:357 epsilon:0.05990\n",
      "done step:13  episode:358 epsilon:0.05990\n",
      "done step:81  episode:359 epsilon:0.05990\n",
      "done step:15  episode:360 epsilon:0.05990\n",
      "done step:12  episode:361 epsilon:0.05990\n",
      "done step:13  episode:362 epsilon:0.05990\n",
      "done step:11  episode:363 epsilon:0.05990\n",
      "done step:11  episode:364 epsilon:0.05990\n",
      "done step:13  episode:365 epsilon:0.05990\n",
      "done step:13  episode:366 epsilon:0.05990\n",
      "done step:8  episode:367 epsilon:0.05990\n",
      "done step:13  episode:368 epsilon:0.05990\n",
      "done step:40  episode:369 epsilon:0.05990\n",
      "done step:11  episode:370 epsilon:0.05990\n",
      "done step:13  episode:371 epsilon:0.05990\n",
      "done step:44  episode:372 epsilon:0.05990\n",
      "done step:12  episode:373 epsilon:0.05990\n",
      "done step:17  episode:374 epsilon:0.05990\n",
      "done step:10  episode:375 epsilon:0.05990\n",
      "done step:12  episode:376 epsilon:0.05990\n",
      "done step:15  episode:377 epsilon:0.05990\n",
      "done step:158  episode:378 epsilon:0.05990\n",
      "done step:63  episode:379 epsilon:0.05990\n",
      "done step:8  episode:380 epsilon:0.05990\n",
      "done step:8  episode:381 epsilon:0.05990\n",
      "done step:50  episode:382 epsilon:0.05990\n",
      "done step:11  episode:383 epsilon:0.05990\n",
      "done step:11  episode:384 epsilon:0.05990\n",
      "done step:11  episode:385 epsilon:0.05990\n",
      "done step:58  episode:386 epsilon:0.05990\n",
      "done step:13  episode:387 epsilon:0.05990\n",
      "done step:15  episode:388 epsilon:0.05990\n",
      "done step:14  episode:389 epsilon:0.05990\n",
      "done step:13  episode:390 epsilon:0.05990\n",
      "done step:15  episode:391 epsilon:0.05990\n",
      "done step:14  episode:392 epsilon:0.05990\n",
      "done step:15  episode:393 epsilon:0.05990\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "done step:97  episode:394 epsilon:0.05990\n",
      "done step:12  episode:395 epsilon:0.05990\n",
      "done step:15  episode:396 epsilon:0.05990\n",
      "done step:14  episode:397 epsilon:0.05990\n",
      "done step:14  episode:398 epsilon:0.05990\n",
      "done step:17  episode:399 epsilon:0.05930\n",
      "done step:14  episode:400 epsilon:0.05930\n",
      "done step:15  episode:401 epsilon:0.05930\n",
      "done step:10  episode:402 epsilon:0.05930\n",
      "done step:10  episode:403 epsilon:0.05930\n",
      "done step:10  episode:404 epsilon:0.05930\n",
      "done step:8  episode:405 epsilon:0.05930\n",
      "done step:12  episode:406 epsilon:0.05930\n",
      "done step:15  episode:407 epsilon:0.05930\n",
      "done step:11  episode:408 epsilon:0.05930\n",
      "done step:11  episode:409 epsilon:0.05930\n",
      "done step:13  episode:410 epsilon:0.05930\n",
      "done step:15  episode:411 epsilon:0.05930\n",
      "done step:13  episode:412 epsilon:0.05930\n",
      "done step:9  episode:413 epsilon:0.05930\n",
      "done step:9  episode:414 epsilon:0.05930\n",
      "done step:10  episode:415 epsilon:0.05930\n",
      "done step:13  episode:416 epsilon:0.05930\n",
      "done step:13  episode:417 epsilon:0.05930\n",
      "done step:9  episode:418 epsilon:0.05930\n",
      "done step:9  episode:419 epsilon:0.05930\n",
      "done step:135  episode:420 epsilon:0.05930\n",
      "done step:73  episode:421 epsilon:0.05930\n",
      "done step:98  episode:422 epsilon:0.05930\n",
      "done step:70  episode:423 epsilon:0.05930\n",
      "done step:129  episode:424 epsilon:0.05930\n",
      "done step:50  episode:425 epsilon:0.05930\n",
      "done step:12  episode:426 epsilon:0.05930\n",
      "done step:88  episode:427 epsilon:0.05930\n",
      "done step:80  episode:428 epsilon:0.05930\n",
      "done step:101  episode:429 epsilon:0.05930\n",
      "done step:49  episode:430 epsilon:0.05930\n",
      "done step:106  episode:431 epsilon:0.05930\n",
      "done step:27  episode:432 epsilon:0.05930\n",
      "done step:15  episode:433 epsilon:0.05930\n",
      "done step:15  episode:434 epsilon:0.05930\n",
      "done step:16  episode:435 epsilon:0.05930\n",
      "done step:79  episode:436 epsilon:0.05930\n",
      "done step:67  episode:437 epsilon:0.05930\n",
      "done step:14  episode:438 epsilon:0.05930\n",
      "done step:96  episode:439 epsilon:0.05930\n",
      "done step:60  episode:440 epsilon:0.05930\n",
      "done step:48  episode:441 epsilon:0.05930\n",
      "done step:54  episode:442 epsilon:0.05930\n",
      "done step:36  episode:443 epsilon:0.05930\n",
      "done step:47  episode:444 epsilon:0.05930\n",
      "done step:34  episode:445 epsilon:0.05930\n",
      "done step:122  episode:446 epsilon:0.05930\n",
      "done step:41  episode:447 epsilon:0.05930\n",
      "done step:68  episode:448 epsilon:0.05930\n",
      "done step:34  episode:449 epsilon:0.05930\n",
      "done step:57  episode:450 epsilon:0.05930\n",
      "done step:40  episode:451 epsilon:0.05930\n",
      "done step:50  episode:452 epsilon:0.05930\n",
      "done step:13  episode:453 epsilon:0.05930\n",
      "done step:30  episode:454 epsilon:0.05930\n",
      "done step:15  episode:455 epsilon:0.05930\n",
      "done step:47  episode:456 epsilon:0.05930\n",
      "done step:20  episode:457 epsilon:0.05930\n",
      "done step:38  episode:458 epsilon:0.05930\n",
      "done step:30  episode:459 epsilon:0.05930\n",
      "done step:65  episode:460 epsilon:0.05930\n",
      "done step:123  episode:461 epsilon:0.05930\n",
      "done step:46  episode:462 epsilon:0.05930\n",
      "done step:36  episode:463 epsilon:0.05930\n",
      "done step:56  episode:464 epsilon:0.05930\n",
      "done step:39  episode:465 epsilon:0.05930\n",
      "done step:101  episode:466 epsilon:0.05930\n",
      "done step:52  episode:467 epsilon:0.05930\n",
      "done step:25  episode:468 epsilon:0.05930\n",
      "done step:86  episode:469 epsilon:0.05930\n",
      "done step:159  episode:470 epsilon:0.05930\n",
      "done step:75  episode:471 epsilon:0.05930\n",
      "done step:29  episode:472 epsilon:0.05930\n",
      "done step:54  episode:473 epsilon:0.05930\n",
      "done step:52  episode:474 epsilon:0.05930\n",
      "done step:23  episode:475 epsilon:0.05930\n",
      "done step:32  episode:476 epsilon:0.05930\n",
      "done step:33  episode:477 epsilon:0.05930\n",
      "done step:62  episode:478 epsilon:0.05930\n",
      "done step:58  episode:479 epsilon:0.05930\n",
      "done step:44  episode:480 epsilon:0.05930\n",
      "done step:75  episode:481 epsilon:0.05930\n",
      "done step:39  episode:482 epsilon:0.05930\n",
      "done step:64  episode:483 epsilon:0.05930\n",
      "done step:32  episode:484 epsilon:0.05930\n",
      "done step:12  episode:485 epsilon:0.05930\n",
      "done step:34  episode:486 epsilon:0.05930\n",
      "done step:36  episode:487 epsilon:0.05930\n",
      "done step:43  episode:488 epsilon:0.05930\n",
      "done step:46  episode:489 epsilon:0.05930\n",
      "done step:46  episode:490 epsilon:0.05930\n",
      "done step:111  episode:491 epsilon:0.05930\n",
      "done step:49  episode:492 epsilon:0.05930\n",
      "done step:49  episode:493 epsilon:0.05930\n",
      "done step:47  episode:494 epsilon:0.05930\n",
      "done step:10  episode:495 epsilon:0.05930\n",
      "done step:66  episode:496 epsilon:0.05930\n",
      "done step:12  episode:497 epsilon:0.05930\n",
      "done step:12  episode:498 epsilon:0.05930\n",
      "done step:45  episode:499 epsilon:0.05870\n",
      "done step:16  episode:500 epsilon:0.05870\n",
      "done step:35  episode:501 epsilon:0.05870\n",
      "done step:39  episode:502 epsilon:0.05870\n",
      "done step:26  episode:503 epsilon:0.05870\n",
      "done step:47  episode:504 epsilon:0.05870\n",
      "done step:57  episode:505 epsilon:0.05870\n",
      "done step:39  episode:506 epsilon:0.05870\n",
      "done step:13  episode:507 epsilon:0.05870\n",
      "done step:11  episode:508 epsilon:0.05870\n",
      "done step:15  episode:509 epsilon:0.05870\n",
      "done step:43  episode:510 epsilon:0.05870\n",
      "done step:93  episode:511 epsilon:0.05870\n",
      "done step:10  episode:512 epsilon:0.05870\n",
      "done step:53  episode:513 epsilon:0.05870\n",
      "done step:71  episode:514 epsilon:0.05870\n",
      "done step:21  episode:515 epsilon:0.05870\n",
      "done step:20  episode:516 epsilon:0.05870\n",
      "done step:62  episode:517 epsilon:0.05870\n",
      "done step:10  episode:518 epsilon:0.05870\n",
      "done step:22  episode:519 epsilon:0.05870\n",
      "done step:22  episode:520 epsilon:0.05870\n",
      "done step:32  episode:521 epsilon:0.05870\n",
      "done step:12  episode:522 epsilon:0.05870\n",
      "done step:29  episode:523 epsilon:0.05870\n",
      "done step:27  episode:524 epsilon:0.05870\n",
      "done step:30  episode:525 epsilon:0.05870\n",
      "done step:12  episode:526 epsilon:0.05870\n",
      "done step:16  episode:527 epsilon:0.05870\n",
      "done step:10  episode:528 epsilon:0.05870\n",
      "done step:69  episode:529 epsilon:0.05870\n",
      "done step:30  episode:530 epsilon:0.05870\n",
      "done step:31  episode:531 epsilon:0.05870\n",
      "done step:34  episode:532 epsilon:0.05870\n",
      "done step:13  episode:533 epsilon:0.05870\n",
      "done step:43  episode:534 epsilon:0.05870\n",
      "done step:16  episode:535 epsilon:0.05870\n",
      "done step:29  episode:536 epsilon:0.05870\n",
      "done step:15  episode:537 epsilon:0.05870\n",
      "done step:39  episode:538 epsilon:0.05870\n",
      "done step:35  episode:539 epsilon:0.05870\n",
      "done step:8  episode:540 epsilon:0.05870\n",
      "done step:30  episode:541 epsilon:0.05870\n",
      "done step:19  episode:542 epsilon:0.05870\n",
      "done step:23  episode:543 epsilon:0.05870\n",
      "done step:23  episode:544 epsilon:0.05870\n",
      "done step:17  episode:545 epsilon:0.05870\n",
      "done step:79  episode:546 epsilon:0.05870\n",
      "done step:16  episode:547 epsilon:0.05870\n",
      "done step:23  episode:548 epsilon:0.05870\n",
      "done step:25  episode:549 epsilon:0.05870\n",
      "done step:50  episode:550 epsilon:0.05870\n",
      "done step:13  episode:551 epsilon:0.05870\n",
      "done step:11  episode:552 epsilon:0.05870\n",
      "done step:24  episode:553 epsilon:0.05870\n",
      "done step:15  episode:554 epsilon:0.05870\n",
      "done step:30  episode:555 epsilon:0.05870\n",
      "done step:17  episode:556 epsilon:0.05870\n",
      "done step:48  episode:557 epsilon:0.05870\n",
      "done step:8  episode:558 epsilon:0.05870\n",
      "done step:22  episode:559 epsilon:0.05870\n",
      "done step:10  episode:560 epsilon:0.05870\n",
      "done step:22  episode:561 epsilon:0.05870\n",
      "done step:21  episode:562 epsilon:0.05870\n",
      "done step:38  episode:563 epsilon:0.05870\n",
      "done step:12  episode:564 epsilon:0.05870\n",
      "done step:31  episode:565 epsilon:0.05870\n",
      "done step:10  episode:566 epsilon:0.05870\n",
      "done step:12  episode:567 epsilon:0.05870\n",
      "done step:12  episode:568 epsilon:0.05870\n",
      "done step:12  episode:569 epsilon:0.05870\n",
      "done step:10  episode:570 epsilon:0.05870\n",
      "done step:12  episode:571 epsilon:0.05870\n",
      "done step:20  episode:572 epsilon:0.05870\n",
      "done step:11  episode:573 epsilon:0.05870\n",
      "done step:15  episode:574 epsilon:0.05870\n",
      "done step:22  episode:575 epsilon:0.05870\n",
      "done step:13  episode:576 epsilon:0.05870\n",
      "done step:13  episode:577 epsilon:0.05870\n",
      "done step:15  episode:578 epsilon:0.05870\n",
      "done step:8  episode:579 epsilon:0.05870\n",
      "done step:8  episode:580 epsilon:0.05870\n",
      "done step:22  episode:581 epsilon:0.05870\n",
      "done step:15  episode:582 epsilon:0.05870\n",
      "done step:41  episode:583 epsilon:0.05870\n",
      "done step:12  episode:584 epsilon:0.05870\n",
      "done step:14  episode:585 epsilon:0.05870\n",
      "done step:15  episode:586 epsilon:0.05870\n",
      "done step:26  episode:587 epsilon:0.05870\n",
      "done step:53  episode:588 epsilon:0.05870\n",
      "done step:11  episode:589 epsilon:0.05870\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "done step:31  episode:590 epsilon:0.05870\n",
      "done step:16  episode:591 epsilon:0.05870\n",
      "done step:10  episode:592 epsilon:0.05870\n",
      "done step:10  episode:593 epsilon:0.05870\n",
      "done step:19  episode:594 epsilon:0.05870\n",
      "done step:41  episode:595 epsilon:0.05870\n",
      "done step:25  episode:596 epsilon:0.05870\n",
      "done step:19  episode:597 epsilon:0.05870\n",
      "done step:21  episode:598 epsilon:0.05870\n",
      "done step:23  episode:599 epsilon:0.05812\n",
      "done step:14  episode:600 epsilon:0.05812\n",
      "done step:12  episode:601 epsilon:0.05812\n",
      "done step:26  episode:602 epsilon:0.05812\n",
      "done step:8  episode:603 epsilon:0.05812\n",
      "done step:11  episode:604 epsilon:0.05812\n",
      "done step:24  episode:605 epsilon:0.05812\n",
      "done step:10  episode:606 epsilon:0.05812\n",
      "done step:31  episode:607 epsilon:0.05812\n",
      "done step:14  episode:608 epsilon:0.05812\n",
      "done step:13  episode:609 epsilon:0.05812\n",
      "done step:13  episode:610 epsilon:0.05812\n",
      "done step:41  episode:611 epsilon:0.05812\n",
      "done step:11  episode:612 epsilon:0.05812\n",
      "done step:16  episode:613 epsilon:0.05812\n",
      "done step:21  episode:614 epsilon:0.05812\n",
      "done step:43  episode:615 epsilon:0.05812\n",
      "done step:14  episode:616 epsilon:0.05812\n",
      "done step:22  episode:617 epsilon:0.05812\n",
      "done step:14  episode:618 epsilon:0.05812\n",
      "done step:12  episode:619 epsilon:0.05812\n",
      "done step:12  episode:620 epsilon:0.05812\n",
      "done step:9  episode:621 epsilon:0.05812\n",
      "done step:11  episode:622 epsilon:0.05812\n",
      "done step:12  episode:623 epsilon:0.05812\n",
      "done step:74  episode:624 epsilon:0.05812\n",
      "done step:37  episode:625 epsilon:0.05812\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-18-3392276ad2fd>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[0mtime_start\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mz\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m     \u001b[0mmain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      4\u001b[0m \u001b[0mtime_end\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<ipython-input-8-1d52c47b084c>\u001b[0m in \u001b[0;36mmain\u001b[1;34m()\u001b[0m\n\u001b[0;32m     38\u001b[0m             \u001b[0mreward_agent\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mreward\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     39\u001b[0m             \u001b[1;31m# 丢入经验池  执行训练\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 40\u001b[1;33m             \u001b[0magent\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mperceive\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maction_1d\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreward\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnext_state\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     41\u001b[0m             \u001b[0mstate\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnext_state\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     42\u001b[0m             \u001b[1;31m# 判断这一步走了每    没走说明这一步是非法的，发生了碰撞，立即结束当前棋局，重开一局\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<ipython-input-5-434b8f3cc33d>\u001b[0m in \u001b[0;36mperceive\u001b[1;34m(self, state, action, reward, next_state, done)\u001b[0m\n\u001b[0;32m     99\u001b[0m         \u001b[1;31m# 一个batch够了\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    100\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreplay_buffer\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>\u001b[0m \u001b[0mBATCH_SIZE\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 101\u001b[1;33m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrain_Q_network\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    102\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    103\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mmodify_last_reward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnew_reward\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<ipython-input-5-434b8f3cc33d>\u001b[0m in \u001b[0;36mtrain_Q_network\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    131\u001b[0m         \u001b[1;31m# Q_value_batch = self.sess.run(self.Q_value, feed_dict={\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    132\u001b[0m         \u001b[1;31m#    self.state_input: next_state_batch, self.turn: next_state_batch_turn})\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 133\u001b[1;33m         Q_value_batch = self.sess.run(self.targetQ_value, feed_dict={\n\u001b[0m\u001b[0;32m    134\u001b[0m             self.state_input: next_state_batch, self.turn: next_state_batch_turn})\n\u001b[0;32m    135\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m    955\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    956\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 957\u001b[1;33m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0m\u001b[0;32m    958\u001b[0m                          run_metadata_ptr)\n\u001b[0;32m    959\u001b[0m       \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m   1148\u001b[0m             \u001b[0mfeed_handles\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0msubfeed_t\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mref\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msubfeed_val\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1149\u001b[0m           \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1150\u001b[1;33m             \u001b[0mnp_val\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msubfeed_val\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msubfeed_dtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1151\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1152\u001b[0m           if (not is_tensor_handle_feed and\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\numpy\\core\\_asarray.py\u001b[0m in \u001b[0;36masarray\u001b[1;34m(a, dtype, order)\u001b[0m\n\u001b[0;32m     83\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     84\u001b[0m     \"\"\"\n\u001b[1;32m---> 85\u001b[1;33m     \u001b[1;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0morder\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     87\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "time_start = time.time()\n",
    "for z in range(3):\n",
    "    main()\n",
    "time_end = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5505\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  -  -  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 8   8\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  -  -  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  -  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 10   10\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  -  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  -  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 8   6\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  -  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  -  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 9   6\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  -  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 10   6\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  -  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 6   6\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 8   7\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 9   9\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 11   6\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 11   10\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 7   6\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  -  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 11   11\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 10   9\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 5   5\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 4   4\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  -  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 7   7\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  -  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 7   11\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 10   13\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  -  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 12   6\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 12   9\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  *  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  -  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 3   3\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  *  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  o  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  -  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 6   8\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  *  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  o  -  -  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  *  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 7   10\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  *  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  o  -  o  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  *  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  -  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 6   10\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  *  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  o  -  o  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  *  *  -  -  -\n",
      " 8  -  -  -  -  -  -  *  *  *  -  *  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " BLACK 8   10\n",
      "\n",
      "    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14\n",
      " 0  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 1  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 2  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " 3  -  -  -  *  -  -  -  -  -  -  -  -  -  -  -\n",
      " 4  -  -  -  -  *  -  -  -  -  -  -  -  -  -  -\n",
      " 5  -  -  -  -  -  o  -  -  -  -  -  -  -  -  -\n",
      " 6  -  -  -  -  -  -  o  -  o  -  o  -  -  -  -\n",
      " 7  -  -  -  -  -  -  *  o  -  -  *  *  -  -  -\n",
      " 8  -  -  -  -  -  o  *  *  *  -  *  -  -  -  -\n",
      " 9  -  -  -  -  -  -  o  -  -  o  -  -  -  -  -\n",
      "10  -  -  -  -  -  -  *  -  -  *  o  -  -  o  -\n",
      "11  -  -  -  -  -  -  *  -  -  -  o  o  -  -  -\n",
      "12  -  -  -  -  -  -  *  -  -  o  -  -  -  -  -\n",
      "13  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      "14  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -\n",
      " WHITE 8   5\n",
      "\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-19-fdb9591b80f6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtrain_step\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mtest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-6-5995fc7e39d1>\u001b[0m in \u001b[0;36mtest\u001b[1;34m()\u001b[0m\n\u001b[0;32m     34\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     35\u001b[0m             \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\" WHITE %d   %d\\n\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0maction\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maction\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 36\u001b[1;33m         \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m  \u001b[1;31m# 睡眠延时\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     37\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     38\u001b[0m         \u001b[1;31m# 结束判断\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "print(len(train_step))\n",
    "test()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20059\n"
     ]
    }
   ],
   "source": [
    "print(len(train_step))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(train_step[0:10000])\n",
    "#plt.savefig(\"C:/Users/王欣哲/Desktop/codes/人工智能基础/问题4 监督学习/15-15_前10000step图.jpg\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
